/* GNUPLOT - eepic.trm */ /* * Copyright (C) 1990 * * Permission to use, copy, and distribute this software and its * documentation for any purpose with or without fee is hereby granted, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. * * Permission to modify the software is granted, but not the right to * distribute the modified code. Modifications are to be distributed * as patches to released version. * * This software is provided "as is" without express or implied warranty. * * This file is included by ../term.c. * * This terminal driver supports: * The EEPIC macros for LaTeX. * * AUTHORS * David Kotz * * send your comments or suggestions to (pixar!info-gnuplot@sun.com). * */ /* * This file contains the eepic terminal driver, intended for use with the * eepic.sty macro package for LaTeX. This is an alternative to the * latex driver. You need eepic.sty, epic.sty, and a printer driver that * supports the tpic . * * Although dotted and dashed lines are possible with EEPIC, and are * tempting, they do not work well for high-sample-rate curves, mushing * the dashes all together into a solid line. For now anyway, the EEPIC * driver will have only solid lines. Anyone got a solution? * * LATEX must also be defined. */

#define EEPIC_PTS_PER_INCH (72.27) #define DOTS_PER_INCH (300) /* resolution of printer we expect to use */ #define EEPIC_UNIT (EEPIC_PTS_PER_INCH/DOTS_PER_INCH) /* dot size in pt */

/* 5 inches wide by 3 inches high (default) */ #define EEPIC_XMAX (5*DOTS_PER_INCH) /* (EEPIC_PTS_PER_INCH/EEPIC_UNIT*5.0) */ #define EEPIC_YMAX (3*DOTS_PER_INCH) /* (EEPIC_PTS_PER_INCH/EEPIC_UNIT*3.0) */

#define EEPIC_HTIC (5*DOTS_PER_INCH/72) /* (5./EEPIC_UNIT) */ #define EEPIC_VTIC (5*DOTS_PER_INCH/72) /* (5./EEPIC_UNIT) */ #define EEPIC_HCHAR (DOTS_PER_INCH*53/10/72) /* (5.3/EEPIC_UNIT) */ #define EEPIC_VCHAR (DOTS_PER_INCH*11/72) /* (11./EEPIC_UNIT) */

static unsigned int EEPIC_posx; static unsigned int EEPIC_posy; enum JUSTIFY eepic_justify=LEFT; static int eepic_angle=0;

/* for DOTS point style */ #define EEPIC_TINY_DOT "
rule.1pt.1pt"

/* POINTS */ #define EEPIC_POINT_TYPES 12 /* we supply more point types */ static char *EEPIC_points[] = "
raisebox-1.2pt
makebox(0,0)
Diamond", "
makebox(0,0)+", "
raisebox-1.2pt
makebox(0,0)
Box", "
makebox(0,0)
times", "
makebox(0,0)
triangle", "
makebox(0,0)
star", "
circle12", "
circle18", "
circle24", "
circle*12", "
circle*18", "
circle*24" ;

/* LINES */ #define EEPIC_NUMLINES 5 /* number of linetypes below */ static char *EEPIC_lines[] = "
thicklines
path", /* -2 border */ "
thinlines
drawline[-50]", /* -1 axes */ "
thinlines
path", /* 0 solid thin */ "
thicklines
path", /* 1 solid thick */ "
Thicklines
path", /* 2 solid Thick */ ; /* These are other possibilities "
thinlines
dottedline30", "
thinlines
drawline[-30]", "
thinlines
dottedline60", "
thinlines
drawline[-60]", "
thinlines
dashline[-10]20[6]" */ static int EEPIC_type; /* current line type */ static BOOLEAN EEPIC_inline = FALSE; /* are we in the middle of a line */ static void EEPIC_endline(); /* terminate any line in progress */ static int EEPIC_linecount = 0; /* number of points in line so far */ #define EEPIC_LINEMAX 50 /* max value for linecount */

/* ARROWS */ /* we use the same code as for LATEX */ static void best_latex_arrow(); /* figure out the best arrow */

EEPIC_init() EEPIC_posx = EEPIC_posy = 0; EEPIC_linetype(-1); fprintf(outfile, "fprintf(outfile, "
setlength
unitlength

EEPIC_scale(xs, ys) double xs, ys; /* scaling factors */ register struct termentry *t = &term_tbl[term];

/* we change the table for use in graphics.c and EEPIC_graphics */ t->xmax = (unsigned int)(EEPIC_XMAX * xs); t->ymax = (unsigned int)(EEPIC_YMAX * ys);

return(TRUE);

EEPIC_graphics() register struct termentry *t = &term_tbl[term];

fprintf(outfile, "
beginpicture(fprintf(outfile, "
tenrm");

EEPIC_text() EEPIC_endline(); fprintf(outfile, "
endpicture");

EEPIC_linetype(linetype) int linetype; EEPIC_endline();

if (linetype >= EEPIC_NUMLINES-2) linetype

EEPIC_type = linetype;

EEPIC_move(x,y) unsigned int x,y; EEPIC_endline();

EEPIC_posx = x; EEPIC_posy = y;

EEPIC_point(x,y, number) /* version of line_and_point */ unsigned int x,y; int number; /* type of point */ EEPIC_move(x,y);

/* Print the character defined by 'number'; number < 0 means to use a dot, otherwise one of the defined points. */ fprintf(outfile, "
put((number < 0 ? EEPIC_TINY_DOT : EEPIC_points[number

EEPIC_vector(ux,uy) unsigned int ux,uy; if (!EEPIC_inline) EEPIC_inline = TRUE;

/* Start a new line. This depends on line type */ fprintf(outfile, "EEPIC_lines[EEPIC_type+2], EEPIC_posx, EEPIC_posy); EEPIC_linecount = 1; else /* Even though we are in middle of a path, * we may want to start a new path command. * If they are too long then latex will choke. */ if (EEPIC_linecount++ >= EEPIC_LINEMAX) fprintf(outfile, ""); fprintf(outfile, "EEPIC_lines[EEPIC_type+2], EEPIC_posx, EEPIC_posy); EEPIC_linecount = 1; fprintf(outfile, "(EEPIC_posx = ux; EEPIC_posy = uy;

static void EEPIC_endline() if (EEPIC_inline) fprintf(outfile, ""); EEPIC_inline = FALSE;

EEPIC_arrow(sx,sy, ex,ey, head) int sx,sy, ex,ey; BOOLEAN head; best_latex_arrow(sx,sy, ex,ey, 2, head); /* call latex routine */

EEPIC_posx = ex; EEPIC_posy = ey;

EEPIC_put_text(x, y, str) int x,y; /* reference point of string */ char str[]; /* the text */ EEPIC_endline();

fprintf(outfile, "
put(switch(eepic_angle) case 0: switch(eepic_justify) case LEFT: fprintf(outfile, "
makebox(0,0)[l]break; case CENTRE: fprintf(outfile, "
makebox(0,0)break; case RIGHT: fprintf(outfile, "
makebox(0,0)[r]break; break; case 1: /* put text in a short stack */ switch(eepic_justify) case LEFT: fprintf(outfile, "
makebox(0,0)[lb]
shortstackbreak; case CENTRE: fprintf(outfile, "
makebox(0,0)[l]
shortstackbreak; case RIGHT: fprintf(outfile, "
makebox(0,0)[lt]
shortstackbreak; break;

int EEPIC_justify_text(mode) enum JUSTIFY mode; eepic_justify = mode; return (TRUE);

int EEPIC_text_angle(angle) int angle; /* we can't really write text vertically, but this will put the ylabel centred at the left of the plot, and then we'll make a */ eepic_angle = angle; return (TRUE);

EEPIC_reset() EEPIC_endline(); EEPIC_posx = EEPIC_posy = 0;